第3章 语言基础(4)

控制流语句

if语句

let i = 10;
if (i > 25) {
  console.log("Greater than 25.");
} else if (i < 0) {
  console.log("Less than 0.");
} else {
  console.log("Between 0 and 25, inclusive.");
}

do-while语句

let i = 0;
do {
  i += 2;
} while (i < 10);

while语句

let i = 0;
while (i < 10) {
  i += 2;
}

for语句

let count = 10;
for (let i = 0; i < count; i++) {
  console.log(i);
}

初始化、条件表达式和循环后表达式都不是必须的

// 无限循环
for (;;) {
  doSomething();
}

// 只包含条件表达式,for循环变成了while循环
let count = 10;
let i = 0;
for (; i < count; ) {
  console.log(i);
    i++; 
}

for-in语句

用于枚举对象中的非符号键属性

for (const propName in window) {
  document.write(propName);
}

控制语句中的 const 不是必需的,但为了确保这个局部变量不被修改,推荐使用 const。如果 for-in 循环要迭代的变量是 null 或 undefined,则不执行循环体。

for-of语句

用于遍历可迭代对象的元素

for (const el of [2,4,6,8]) {
  document.write(el);
}

控制语句中的 const 不是必需的,但为了确保这个局部变量不被修改,推荐使用 const。for-of 循环会按照可迭代对象的 next()方法产生值的顺序迭代元素。如果尝试迭代的变量不支持迭代,则 for-of 语句会抛出错误。

标签语句

start: for (let i = 0; i < count; i++) {
  console.log(i);
}

在这个例子中,start 是一个标签,可以在后面通过 break 或 continue 语句引用,多数用于跳出特定循环

break 和 continue 语句

break语句用于立即退出循环,执行循环后的下一条语句

let num = 0;
for (let i = 1; i < 10; i++) {
  if (i % 5 == 0) {
    break;
  }
  num++;
}
console.log(num); // 4

continue语句用于立即退出本次循环,再次判断条件以执行下次循环语句

let num = 0;
for (let i = 1; i < 10; i++) {
  if (i % 5 == 0) {
    continue;
  }
  num++;
}
console.log(num); // 8

break 和 continue 都可以与标签语句一起使用,返回代码中特定的位置

let num = 0;

outermost:
for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i == 5 && j == 5) {
      break outermost;
    }
    num++;
  }
}
console.log(num); // 55

以上代码使用 continue 也有类似效果,使用 continue 跳出循环时,最终 num 的值为95

with语句(供了解,不推荐使用)

将代码作用域设置为特定的对象,使用该语句的主要场景是针对一个对象反复操作,这时候将代码作用域设置为该对象能提供便利

let qs = location.search.substring(1);
let hostName = location.hostname;
let url = location.href;
// 上面代码中的每一行都用到了 location 对象
// 使用 with 语句,可以简化一些代码
with(location) {
  let qs = search.substring(1);
  let hostName = hostname;
  let url = href;
}

这里,with 语句用于连接 location 对象。这意味着在这个语句内部,每个变量首先会被认为是一个局部变量。如果没有找到该局部变量,则会搜索 location 对象,看它是否有一个同名的属性。如果有,则该变量会被求值为 location 对象的属性

switch语句

let i = 35;
switch (i) {
  case 25:
    console.log("25");
    break; // break关键字用于跳出switch语句,如果没有break,则代码会继续匹配下一个条件
  case 35:
    console.log("35");
    break;
  case 45:
    console.log("45");
    break;
  default:
    console.log("Other");
}

最好给每个条件后面都加上 break 语句,如果确实需要连续匹配几个条件,那么推荐写个注释表明是故意忽略了break

与其他语言相比,JS的 switch 语句有一些特性:

函数

使用 function 关键字声明,后跟一组参数,然后是函数体。可以通过函数名来调用函数,要传给函数的参数放在括号里(如果有多个参数,则用逗号隔开)

function sayHi(name, message) {
  console.log("Hello " + name + ", " + message);
}

sayHi("Nicholas", "how are you today?");
// 控制台输出 Hello Nicholas, how are you today?

任何函数在任何时间都可以使用 return 语句来返回函数的值

function sum(num1, num2) {
  return num1 + num2;
  console.log("Hello world"); // 不会执行
}
const result = sum(5, 10); // 15

一个函数可以有多个 return 语句

function diff(num1, num2) {
  if (num1 < num2) {
    return num2 - num1;
  } else {
    return num1 - num2;
  }
}

return 语句可以不带返回值,用于提前终止函数执行


function sayHi(name, message) {
    return;
    console.log("Hello " + name + ", " + message); // 不会执行
}